home *** CD-ROM | disk | FTP | other *** search
/ Chip 2005 August (Alt) / CHIP 2005-08.1.iso / program / code / Firefox_1.0.5.exe / browser.xpi / bin / chrome / browser.jar / content / browser / search.xml < prev    next >
Encoding:
Extensible Markup Language  |  2005-02-17  |  14.7 KB  |  371 lines

  1. <?xml version="1.0"?>
  2.  
  3.  
  4. <bindings id="SearchBindings"
  5.           xmlns="http://www.mozilla.org/xbl"
  6.           xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  7.           xmlns:xbl="http://www.mozilla.org/xbl">
  8.  
  9.   <binding id="searchbar-base">
  10.     <resources>
  11.       <stylesheet src="chrome://browser/content/searchbarBindings.css"/>
  12.       <stylesheet src="chrome://browser/skin/searchbar.css"/>
  13.     </resources>
  14.   </binding>
  15.  
  16.   <binding id="searchbar" extends="chrome://browser/content/search.xml#searchbar-base">
  17.     <content>
  18.       <xul:stringbundle src="chrome://browser/locale/searchbar.properties"/>
  19.       <xul:textbox class="searchbar-textbox" type="autocomplete" flex="1"
  20.                    autocompletepopup="PopupAutoComplete"
  21.                    autocompletesearch="form-history"
  22.                    autocompletesearchparam="searchbar-history"
  23.                    completeselectedindex="true"
  24.                    tabscrolling="true"
  25.                    onfocus="URLBarFocusHandler(event, this);"
  26.                    onmousedown="URLBarMouseDownHandler(event, this);"
  27.                    onclick="URLBarClickHandler(event, this);"
  28.                    xbl:inherits="disableautocomplete,searchengine,src">
  29.         <xul:button class="searchbar-dropmarker" type="menu"
  30.                     popup="_child" xbl:inherits="src">
  31.           <xul:menupopup anonid="searchbar-popup" position="after_start"
  32.                          datasources="rdf:internetsearch"
  33.                          ref="NC:SearchEngineRoot" 
  34.                          oncommand="this.parentNode.parentNode.onEnginePopupCommand(event);"
  35.                          onpopupshowing="this.parentNode.parentNode.onEnginePopupShowing(event);"
  36.                          onpopuphidden="this.parentNode.parentNode.onEnginePopupHidden(event);">
  37.             <xul:template>
  38.               <xul:menuitem type="checkbox"
  39.                             uri="rdf:*" value="rdf:*"
  40.                             src="rdf:http://home.netscape.com/NC-rdf#Icon"
  41.                             label="rdf:http://home.netscape.com/NC-rdf#Name"/>
  42.             </xul:template>
  43.           </xul:menupopup>
  44.         </xul:button>
  45.       </xul:textbox>
  46.     </content>
  47.     <implementation>
  48.       <field name="mStringBundle"> document.getAnonymousNodes(this)[0] </field>
  49.       <field name="mTextbox"> document.getAnonymousNodes(this)[1] </field>
  50.       <method name="focus">
  51.         <body><![CDATA[
  52.           this.mTextbox.focus();
  53.         ]]></body>
  54.       </method>
  55.       <method name="select">
  56.         <body><![CDATA[
  57.           this.mTextbox.select();
  58.         ]]></body>
  59.       </method>
  60.     </implementation>
  61.   </binding>
  62.  
  63.   <binding id="searchbar-textbox" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete">
  64.     <implementation>
  65.  
  66.       <constructor><![CDATA[
  67.         if (this.parentNode.parentNode.parentNode.localName ==
  68.             "toolbarpaletteitem")
  69.           return;
  70.         setTimeout(function(a) { a.initialize(); }, 0, this);
  71.       ]]></constructor>
  72.  
  73.       <destructor><![CDATA[
  74.         if (this.parentNode.parentNode.parentNode.localName ==
  75.             "toolbarpaletteitem")
  76.           return;
  77.         this.controllers.removeController(this.searchbarController);
  78.       ]]></destructor>
  79.  
  80.       <property name="mContextMenu" readonly="true">
  81.         <getter>
  82.           var textBox = document.getAnonymousElementByAttribute(this, 
  83.                         "anonid", "textbox-input-box");
  84.           return document.getAnonymousElementByAttribute(textBox, 
  85.                         "anonid", "input-box-contextmenu");
  86.         </getter>
  87.       </property>
  88.  
  89.       <method name="initialize">
  90.         <body><![CDATA[
  91.           this.RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  92.                                .getService(Components.interfaces.nsIRDFService);
  93.           this.ISEARCHDS = this.RDF.GetDataSource("rdf:internetsearch");
  94.           this.FORMHISTSVC = Components
  95.                               .classes["@mozilla.org/satchel/form-history;1"]
  96.                               .getService(Components.interfaces.nsIFormHistory);
  97.  
  98.           var engine = this.currentEngine;
  99.           if (!engine)
  100.             this.currentEngine = this.getDefaultEngine();
  101.           else {
  102.             var rEngine = this.RDF.GetResource(engine);
  103.             var rChild  = this.RDF.GetResource("http://home.netscape.com/NC-rdf#child");
  104.             if (!this.ISEARCHDS.hasArcIn(rEngine, rChild)) {
  105.               this.currentEngine = this.getDefaultEngine();
  106.             } // if default engine not found... XXXblake what to do now?
  107.           }
  108.  
  109.           var element;
  110.           element = document.createElementNS(XUL_NS, "menuseparator");
  111.           this.mContextMenu.appendChild(element);
  112.           element = document.createElementNS(XUL_NS, "menuitem");
  113.           element.setAttribute("label", this.mStringBundle
  114.                                .getString("cmd_clearHistory"));
  115.           element.setAttribute("accesskey", this.mStringBundle
  116.                                .getString("cmd_clearHistory_accesskey"));
  117.           element.setAttribute("cmd", "cmd_clearhistory");
  118.           this.mContextMenu.appendChild(element);
  119.           this.controllers.appendController(this.searchbarController);
  120.  
  121.           this.parentNode.setAttribute("persist", "searchengine,src");
  122.  
  123.         ]]></body>
  124.       </method>
  125.  
  126.       <field name="mStringBundle"> this.parentNode.mStringBundle </field>
  127.       <field name="RDF"/>
  128.       <field name="ISEARCHDS"/>
  129.       <field name="FORMHISTSVC"/>
  130.  
  131.       <property name="currentEngine"
  132.                 onget="return this.parentNode.getAttribute('searchengine')">
  133.         <setter><![CDATA[
  134.           if (!val)
  135.             return;
  136.  
  137.           this.parentNode.setAttribute("searchengine", val);
  138.           const kNC_Icon = this.RDF.GetResource("http://home.netscape.com/NC-rdf#Icon");
  139.           var rEngine = this.RDF.GetResource(val);
  140.           this.parentNode.setAttribute("src", this.readRDFString(rEngine, kNC_Icon));
  141.           
  142.           const kNC_Name = this.RDF.GetResource("http://home.netscape.com/NC-rdf#Name");
  143.           var pls = Components.classes["@mozilla.org/pref-localizedstring;1"]
  144.                               .createInstance(Components.interfaces.nsIPrefLocalizedString);
  145.           pls.data = this.readRDFString(rEngine, kNC_Name);
  146.           var PREF = Components.classes["@mozilla.org/preferences-service;1"]
  147.                                .getService(Components.interfaces.nsIPrefService)
  148.                                .getBranch(null);
  149.           PREF.setComplexValue("browser.search.selectedEngine", 
  150.                                Components.interfaces.nsIPrefLocalizedString,
  151.                                pls);
  152.  
  153.         ]]></setter>
  154.       </property>
  155.  
  156.       <method name="getDefaultEngine">
  157.         <body><![CDATA[
  158.           var PREF = Components.classes["@mozilla.org/preferences-service;1"]
  159.                                .getService(Components.interfaces.nsIPrefService)
  160.                                .getBranch(null);
  161.           var defaultName = PREF.getComplexValue("browser.search.defaultenginename",
  162.                                                  Components.interfaces.nsIPrefLocalizedString).data;
  163.  
  164.           const kNC_Root  = this.RDF.GetResource("NC:SearchEngineRoot");
  165.           const kNC_child = this.RDF.GetResource("http://home.netscape.com/NC-rdf#child");
  166.           const kNC_Name  = this.RDF.GetResource("http://home.netscape.com/NC-rdf#Name");
  167.           
  168.           var arcs = this.ISEARCHDS.GetTargets(kNC_Root, kNC_child, true);
  169.           while (arcs.hasMoreElements()) {
  170.             var rEngine = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  171.             var name = this.readRDFString(rEngine, kNC_Name);
  172.             if (name == defaultName)
  173.               return rEngine.Value;
  174.           }
  175.           return null;
  176.         ]]></body>
  177.       </method>
  178.  
  179.       <method name="readRDFString">
  180.         <parameter name="aRes"/>
  181.         <parameter name="aProp"/>
  182.         <body><![CDATA[
  183.           var n = this.ISEARCHDS.GetTarget(aRes, aProp, true);
  184.           return n ? n.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : null;
  185.         ]]></body>
  186.       </method>
  187.  
  188.       // overload |onTextEntered| in autocomplete.xml
  189.       <method name="onTextEntered">
  190.         <body><![CDATA[
  191.           // Save the current value in the form history
  192.           if (!this.hasAttribute("disableautocomplete"))
  193.             this.FORMHISTSVC.addEntry(this.getAttribute(
  194.                                       "autocompletesearchparam"), this.value);
  195.  
  196.           var ISEARCHSVC = Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
  197.                                      .getService(Components.interfaces.nsIInternetSearchService);
  198.           var searchURL = ISEARCHSVC.GetInternetSearchURL(this.currentEngine,
  199.                                        this.value? encodeURIComponent(this.value):"", 
  200.                                        0, 0, {value:0});
  201.  
  202.           if (!this.value) {
  203.             var uri = Components.classes['@mozilla.org/network/standard-url;1']
  204.                                 .createInstance(Components.interfaces.nsIURI);
  205.             uri.spec = searchURL;
  206.             searchURL = uri.host;
  207.             if (!searchURL)
  208.               return;
  209.           }
  210.           SearchLoadURL(searchURL, this.mEnterEvent);
  211.         ]]></body>
  212.       </method>
  213.  
  214.       <method name="onEnginePopupCommand">
  215.         <parameter name="aEvent"/>
  216.         <body><![CDATA[
  217.           var target = aEvent.target
  218.           if (target.getAttribute("anonid") == "addengine-menuitem") {
  219.             var regionBundle = document.getElementById("bundle_browser_region");
  220.             loadURI(regionBundle.getString("searchEnginesURL"), null, null);
  221.           } else {
  222.             this.currentEngine = target.id;
  223.             this.focus();
  224.             this.select();
  225.           }
  226.         ]]></body>
  227.       </method>
  228.  
  229.       <method name="onEnginePopupShowing">
  230.         <parameter name="aEvent"/>
  231.         <body><![CDATA[
  232.           var target = aEvent.target;
  233.           var element = document.getAnonymousElementByAttribute(this.parentNode,
  234.                            "anonid", "addengine-menuitem");
  235.           if (element)
  236.             return;
  237.  
  238.           element = document.createElementNS(XUL_NS, "menuseparator");
  239.           target.appendChild(element);
  240.           element = document.createElementNS(XUL_NS, "menuitem");
  241.           element.setAttribute("label", this.mStringBundle
  242.               .getString("cmd_addEngine"));
  243.           element.setAttribute("accesskey", this.mStringBundle
  244.               .getString("cmd_addEngine_accesskey"));
  245.           element.setAttribute("anonid", "addengine-menuitem");
  246.           target.appendChild(element);
  247.         ]]></body>
  248.       </method>
  249.  
  250.       <method name="onEnginePopupHidden">
  251.         <parameter name="aEvent"/>
  252.         <body><![CDATA[
  253.           var target = aEvent.target;
  254.           var element = document.getAnonymousElementByAttribute(this.parentNode,
  255.                            "anonid", "addengine-menuitem");
  256.           if (element) {
  257.             target.removeChild(target.lastChild);
  258.             target.removeChild(target.lastChild);
  259.           }
  260.         ]]></body>
  261.       </method>
  262.  
  263.       <!-- nsIController -->
  264.       <field name="searchbarController" readonly="true"><![CDATA[
  265.       ({
  266.         mOuter: this,
  267.         
  268.         supportsCommand: function (aCommand)
  269.         {
  270.           return aCommand == "cmd_clearhistory";
  271.         },
  272.         
  273.         isCommandEnabled: function (aCommand)
  274.         {
  275.           return this.mOuter.FORMHISTSVC.nameExists(
  276.                  this.mOuter.getAttribute("autocompletesearchparam"));
  277.         },
  278.  
  279.         doCommand: function (aCommand)
  280.         {
  281.           this.mOuter.FORMHISTSVC.removeEntriesForName(
  282.               this.mOuter.getAttribute("autocompletesearchparam"));
  283.           this.mOuter.value = "";
  284.         }
  285.       })
  286.       ]]></field>
  287.  
  288.       <!-- DND Observer -->
  289.       <field name="searchbarDNDObserver" readonly="true"><![CDATA[
  290.       ({
  291.         mOuter: this,
  292.  
  293.         onDrop: function (aEvent, aXferData, aDragSession)
  294.         {
  295.           var data = transferUtils.retrieveURLFromData(aXferData.data, 
  296.                          aXferData.flavour.contentType);
  297.           if (data) {
  298.             // XXXBlake Workaround caret crash when you try to set the 
  299.             // textbox's value on dropping
  300.             setTimeout(function(This, data, evt) { This.value = data; This.onTextEntered(evt); }, 0, this.mOuter, data, aEvent);      
  301.           }
  302.         },
  303.  
  304.         getSupportedFlavours: function ()
  305.         {
  306.           var flavourSet = new FlavourSet();
  307.  
  308.           flavourSet.appendFlavour("text/unicode");
  309.           flavourSet.appendFlavour("text/x-moz-url");
  310.           flavourSet.appendFlavour("application/x-moz-file", "nsIFile");     
  311.           return flavourSet;
  312.         }
  313.       })
  314.       ]]></field>
  315.  
  316.     </implementation>
  317.  
  318.     <handlers>
  319.  
  320.       <handler event="keypress" keycode="vk_up" modifiers="control" phase="capturing">
  321.         <![CDATA[
  322.           var currentEngine = this.currentEngine;
  323.           if (currentEngine) {
  324.           var searchEngineMenuitem = document.getAnonymousElementByAttribute(this.parentNode, "id", currentEngine);
  325.             var newEngine = searchEngineMenuitem.previousSibling;
  326.             if (newEngine)
  327.               this.currentEngine = newEngine.id;
  328.           }
  329.           event.preventDefault();
  330.           event.stopPropagation();
  331.         ]]>
  332.       </handler>
  333.  
  334.       <handler event="keypress" keycode="vk_down" modifiers="control" phase="capturing">
  335.         <![CDATA[
  336.           var currentEngine = this.currentEngine;
  337.           if (currentEngine) {
  338.             var searchEngineMenuitem = document.getAnonymousElementByAttribute(this.parentNode, "id", currentEngine);
  339.  
  340.             var newEngine = searchEngineMenuitem.nextSibling;
  341.           
  342.             if (newEngine)
  343.               this.currentEngine = newEngine.id;
  344.           }
  345.           event.preventDefault();
  346.           event.stopPropagation();
  347.         ]]>
  348.       </handler>
  349.  
  350.       <handler event="dragdrop" phase="capturing">
  351.         nsDragAndDrop.drop(event, this.searchbarDNDObserver);
  352.       </handler>
  353.  
  354.     </handlers>
  355.  
  356.   </binding>
  357.   
  358.   <binding id="searchbar-dropmarker" extends="chrome://browser/content/search.xml#searchbar-base">
  359.     <content>
  360.       <xul:stack flex="1">
  361.         <xul:hbox align="center">
  362.           <xul:image class="searchbar-engine-image" xbl:inherits="src"/>
  363.         </xul:hbox>
  364.         <xul:image class="searchbar-dropmarker-image"/>
  365.       </xul:stack>
  366.       <children/>
  367.     </content>  
  368.   </binding>
  369.  
  370. </bindings>
  371.